package com.doctcloud.common.core.zip;

import net.lingala.zip4j.ZipFile;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.model.enums.EncryptionMethod;

import java.io.File;
/**
 * @author :  doctCloud samula
 * @date :  2025/11/26
 * @Descript :
 *  String sourceFolderPath = "d:/target"; // 要被压缩的文件夹
 *         String zipFilePath = "d:/zip/2024-05-20_encrypted.zip"; // 生成的ZIP文件路径
 *         String zipPassword = "MySecretPassword123!"; // 压缩密码
 *
 *  zipUtils.zipTargetFolderWithPassword(
 *                 new File(sourceFolderPath),
 *                 zipFilePath,
 *                 zipPassword
 *             );
 */
public class zipUtils {
    public static void zipTargetFolderWithPassword(File sourceDir, String zipFilePath, String password) {
        if (password == null || password.isEmpty()) {
            throw new IllegalArgumentException("密码不能为空");
        }
        // 检查源文件夹是否存在，如果不存在则尝试创建
        if (!sourceDir.exists()) {
            // mkdirs() 可以创建多级目录
            boolean dirCreated = sourceDir.mkdirs();
            if (dirCreated) {
                System.out.println("源文件夹不存在，已成功创建: " + sourceDir.getAbsolutePath());
            } else {
                // 如果创建失败（例如权限问题），则抛出异常
                throw new RuntimeException("源文件夹不存在，且创建失败，请检查路径和权限: " + sourceDir.getAbsolutePath());
            }
        }
        // 确保源路径是一个目录
        else if (!sourceDir.isDirectory()) {
            throw new RuntimeException("指定的源路径不是一个目录: " + sourceDir.getAbsolutePath());
        }

        File zipFile = new File(zipFilePath);
        File parentDir = zipFile.getParentFile();
        if (parentDir != null && !parentDir.exists()) {
            boolean dirCreated = parentDir.mkdirs();
            if (dirCreated) {
                System.out.println("目标文件父目录不存在，已成功创建: " + parentDir.getAbsolutePath());
            } else {
                throw new RuntimeException("目标文件父目录不存在，且创建失败，请检查路径和权限: " + parentDir.getAbsolutePath());
            }
        }

        try {
            // 1. 创建 ZipFile 对象（仅指定文件路径）
            ZipFile zip = new ZipFile(zipFilePath);

            // 2. 设置密码
            zip.setPassword(password.toCharArray());

            // 3. 设置加密参数（AES-256）
            ZipParameters params = new ZipParameters();
            params.setEncryptFiles(true);
            params.setEncryptionMethod(EncryptionMethod.AES);

            // 4. 添加文件夹到 ZIP
            zip.addFolder(sourceDir, params);

            // 5. 关闭资源
            zip.close();

            System.out.println("加密ZIP文件已成功生成: " + zipFilePath);
        } catch (Exception e) {
            throw new RuntimeException("压缩失败: " + e.getMessage(), e);
        }
    }
}
